package org.ala.tiktools.sharddb.mybatis.interceptor;

import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

import org.ala.tiktools.sharddb.mybatis.summary.ICustomSummary;


/**
 * 分库分表路由的注解标记
 * <p>  打上此标记的method会执行分库分表逻辑
 * <p>  路由 -> 执行 -> 聚合
 *
 * @author ala
 * @date 2025-02-19 11:53
 */
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
@Inherited
public @interface Shard {
    /**
     *  是否按照后缀自动创建表
     *  <p> 为true如果抛出 SQLSyntaxErrorException: Table '...' doesn't exist 会自动创建表名
     */
    boolean autoCreateTable() default false;
    /**
     *  是否允许跨库表
     *  <p> 若配置为false，则router逻辑只允许返回1个分库分表
     *  <p> 依自己业务而定
     */
    boolean allowSummary() default true;
    /**
     *  结果汇总器
     *  <p> 只取第0个，这么写是为了兼容不配的情况
     *  <p> 需要继承自 ISummary 的多个子类，注：直接继承ISummary无效！！！
     *  <p>     IShardSummary, IShardOrderBySummary, IShardListSummary, IShardListOrderBySummary, IShardPagerSummary, IShardPagerOrderBySummary
     *  <p> 内置的汇总器：ShardSumSummary, ShardListSummary, ShardPagerSummary
     *          当没有指定汇总器时，会根据method的返回值类型自行适配内置汇总器。
     *          当参数中存在IOrderBy类型时，内置的List和Pager会默认使用其排序
     */
    @SuppressWarnings("rawtypes")
	Class<? extends ICustomSummary>[] summary() default {};

    /**
     *  任务执行超时时间
     *  <p> 单位：毫秒
     */
    long timeout() default 10000l;
    /**
     *  执行任务线程池配置
     *  <p> 会有个公共业务线程池(5, 50, 1024)
     *  <p> 若自己单独配置过则该方法会走自己的私有线程池
     */
    int coreSize() default -1;
    int maxSize() default -1;
    int queueSize() default -1;
}
